const crypto = require('crypto');

/**
 *
 * @returns {Buffer}
 */
/**
 * 生成AES所需的密钥
 *
 * @returns {Buffer} 返回一个16字节的随机数据作为AES密钥
 */
function generateAesKey() {
  // 生成16字节的随机数据作为AES-128密钥
  return crypto.randomBytes(16);
}

/**
 * AES 加密
 * @param {Buffer} data - 要加密的数据（字节数组）
 * @param {Buffer} key - 密钥（16字节，128位）
 * @param {string} algorithm - 加密算法，默认为 'aes-128-cbc'
 * @returns {Buffer} 加密后的数据（字节数组）
 */
function aesEncrypt(data, key, algorithm = 'aes-128-ecb') {
  // 验证密钥长度
  if (key.length !== 16) {
    throw new Error('密钥长度必须为16字节（128位）');
  }

  // 根据算法类型决定是否使用IV
  let cipher;
  if (algorithm.includes('ecb')) {
    // ECB模式不需要IV
    cipher = crypto.createCipheriv(algorithm, key, null);
  } else {
    // 其他模式需要IV
    cipher = crypto.createCipheriv(algorithm, key, Buffer.alloc(16, 0));
  }

  // 执行加密
  const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);

  return encrypted;
}

/**
 * AES 解密
 * @param {Buffer} encryptedData - 要解密的数据（字节数组）
 * @param {Buffer} key - 密钥（16字节，128位）
 * @param {string} algorithm - 加密算法，默认为 'aes-128-cbc'
 * @returns {Buffer} 解密后的数据（字节数组）
 */
function aesDecrypt(encryptedData, key, algorithm = 'aes-128-ecb') {
  // 验证密钥长度
  if (key.length !== 16) {
    throw new Error('密钥长度必须为16字节（128位）');
  }

  // 根据算法类型决定是否使用IV
  let decipher;
  if (algorithm.includes('ecb')) {
    // ECB模式不需要IV
    decipher = crypto.createDecipheriv(algorithm, key, null);
  } else {
    // 其他模式需要IV
    decipher = crypto.createDecipheriv(algorithm, key, Buffer.alloc(16, 0));
  }

  // 执行解密
  const decrypted = Buffer.concat([decipher.update(encryptedData), decipher.final()]);

  return decrypted;
}

// 使用示例
function example() {
  try {
    // 准备测试数据
    const originalData = Buffer.from('Hello, World!', 'utf8');
    // const key = crypto.randomBytes(16); // 128位密钥
    const key = Buffer.from('W1kBIaA0lsQ8KxNx', 'utf8');

    console.log('原始数据:', originalData);
    console.log('密钥:', key.toString('hex'));

    // 加密
    const encrypted = aesEncrypt(originalData, key);
    console.log('加密后:', encrypted);

    // 解密
    const decrypted = aesDecrypt(encrypted, key);
    console.log('解密后:', decrypted);
    console.log('解密文本:', decrypted.toString('utf8'));

    // 验证加解密是否正确
    console.log('加解密验证:', originalData.equals(decrypted) ? '成功' : '失败');

  } catch (error) {
    console.error('错误:', error.message);
  }
}

// 导出函数供其他模块使用
module.exports = {
  generateAesKey,
  aesEncrypt,
  aesDecrypt
};

// 如果直接运行此文件，执行示例
if (require.main === module) {
  example();
}
